/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.upn.sigemfi.rec.bc;

import edu.upn.sigemfi.rec.be.Credito;
import edu.upn.sigemfi.rec.be.CuotaCredito;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

/**
 *
 * @author Diego
 */
public class CreditoDelegate {
    private CuotaCreditoDelegate cuotalocal;
    private CreditoFacadeLocal local;

    public CreditoDelegate() {
        local = lookupCreditoFacade();
        cuotalocal = new CuotaCreditoDelegate();
    }

    public void crear(Credito credito, int nroCuotas, double interes) throws Exception{
        try{
            local.create(credito);
            Calendar cal = Calendar.getInstance();
            for (int i = 0; i < nroCuotas; i++) {
                CuotaCredito cuota = new CuotaCredito();
                cuota.setNroCuota(i + 1);
                cuota.setFidRecCredito(credito);

                double coninteres = (credito.getMontoTotal() / nroCuotas) * interes;
                cuota.setMonto((credito.getMontoTotal() / nroCuotas) + coninteres);
                cuota.setMontoVencido(cuota.getMonto());
                cuota.setMora(0.0);
                cuota.setCuotaSeguro(0.0);
                cal.setTime(credito.getFechaInicio());
                cal.set(Calendar.MONTH, cal.get(Calendar.MONTH) + i);
                cuota.setFechaVencimiento(cal.getTime());
                cuotalocal.crear(cuota);                
            }
        }catch (Exception ex){
            local=lookupCreditoFacade();
            throw new Exception("Crear Credito. "+ex.getMessage());
        }
    }

    private CreditoFacadeLocal lookupCreditoFacade() {
        try {
            Context c = new InitialContext();
            return (CreditoFacadeLocal) c.lookup("java:comp/env/CreditoFacade");
        } catch (NamingException ne) {
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ne);
            throw new RuntimeException(ne);
        }
    }

    public void editar(Credito credito) throws Exception
    {
        try{
            local.edit(credito);
        }catch (Exception ex){
            local=lookupCreditoFacade();
            throw new Exception("Editar Credito. "+ex.getMessage());
        }
    }
    
    public Credito buscar(long credito) throws Exception
    {
        try{
            return local.find(credito);
        }catch (Exception ex){
            local=lookupCreditoFacade();
            throw new Exception("Editar Credito. "+ex.getMessage());
        }
    }



    public List<Credito> listar() throws Exception {
        try {
            return local.findAll();
        } catch (Exception e) {
            local = lookupCreditoFacade();
            throw new Exception("Listar Creditos. " + e.getMessage(), e);
        }
    }

    public List<Credito> listarVigentes() throws Exception {
        try {
            return local.findAllVigentes();
        } catch (Exception e) {
            local = lookupCreditoFacade();
            throw new Exception("Listar Creditos. " + e.getMessage(), e);
        }
    }
    public List<Credito> listarVencidos() throws Exception {
        try {
            return local.findAllVencidos();
        } catch (Exception e) {
            local = lookupCreditoFacade();
            throw new Exception("Listar Creditos. " + e.getMessage(), e);
        }
    }
    public List<Credito> listarRefinanciados() throws Exception {
        try {
            return local.findAllRefinanciados();
        } catch (Exception e) {
            local = lookupCreditoFacade();
            throw new Exception("Listar Creditos. " + e.getMessage(), e);
        }
    }
    public List<Credito> listarPrejudiciales() throws Exception {
        try {
            return local.findAllPrejudiciales();
        } catch (Exception e) {
            local = lookupCreditoFacade();
            throw new Exception("Listar Creditos. " + e.getMessage(), e);
        }
    }
    public List<Credito> listarJudiciales() throws Exception {
        try {
            return local.findAllJudiciales();
        } catch (Exception e) {
            local = lookupCreditoFacade();
            throw new Exception("Listar Creditos. " + e.getMessage(), e);
        }
    }
    public List<Credito> listarCastigados() throws Exception {
        try {
            return local.findAllCastigados();
        } catch (Exception e) {
            local = lookupCreditoFacade();
            throw new Exception("Listar Creditos. " + e.getMessage(), e);
        }
    }
    public List<Credito> listarCancelados() throws Exception {
        try {
            return local.findAllCancelados();
        } catch (Exception e) {
            local = lookupCreditoFacade();
            throw new Exception("Listar Creditos. " + e.getMessage(), e);
        }
    }
}
